
#最新方法

import math
from decimal import Decimal
import numpy as np
import matplotlib.pyplot as plt

import matplotlib

matplotlib.use('TkAgg')


def step1(mins, wcss, zcss, years, c):
    p = 0
    for i in range(years):
        p = p + (wcss[i] / zcss[i])

    p = p / years
    wc = int(p * c)
    return wc


def step2(wc, d, ndxs, years, k):
    n = 0
    for i in range(years):
        n = n + (d - float(ndxs[i]))
    n = n / years
    wc = wc + k * n
    return wc


# 定义Sigmoid函数，使用numpy处理数值计算
def sigmoid(x):
    return 1 / (1 + np.exp(-x))


def step3(b, wc, l, sums, years, c, m):
    # 计算历史招生平均人数
    # historical_avg_enrollment = sum(sums) / years
    # 计算当前招生人数与历史平均人数的比例
    # enrollment_ratio = l / historical_avg_enrollment
    # 结合考生位次与调整后的录取最低位次计算录取概率
    # 调整陡度系数为 0.01
    steepness = 0.001
    x = steepness * (wc - b)
    # 将x代入Sigmoid函数，得到初步的录取概率
    base_probability = sigmoid(x)

    # 调整招生人数比例，使得 enrollment_ratio 与 1 之间的距离越远，影响越大
    # 计算 enrollment_ratio 与 1 的差值
    # ratio_diff = enrollment_ratio - 1
    # 使用一个系数来控制影响的强度，这里设为 2，可根据实际情况调整
    # influence_coefficient = 2
    # 计算调整因子
    # adjustment_factor = sigmoid(influence_coefficient * ratio_diff)

    # 根据调整因子调整录取概率
    #p = base_probability * adjustment_factor + (1 - base_probability) * (1 - adjustment_factor)

    p = base_probability
    # 确保最终概率在 0 - 1 区间
    p = np.clip(p, 0, 1)
    return p


if __name__ == '__main__':
    a = 490  # 输入分数
    b = 25000  # 位次，明显大于最近 5 年最低分排名
    c = 60000  # 考生数
    d = 0.700  # 难度系数
    l = 5  # 模拟不同的专业录取人数
    years = 5  # 最近数据年数
    mins = [505, 510, 512, 515, 518]  # 最近5年最低分 A
    maxs = [630, 635, 642, 650, 658]  # 最近5年最高分 M
    avgs = [518, 520, 522, 524, 526]  # 最近5年平均分 G
    sums = [1, 2, 3, 2, 4]  # 最近5年录取人数 S
    wcss = [10000, 10200, 10400, 10600, 10800]  # 最近5年最低分排名 W
    zcss = [52000, 52500, 53000, 53500, 54000]  # 最近5年总人数 Z
    ndxs = [Decimal('0.692'), Decimal('0.696'), Decimal('0.699'), Decimal('0.702'), Decimal('0.704')]  # 最近5年难度系数 N

    k = 100  # 假设难度系数每变化0.1，录取最低位次相应变化k名，k可以根据经验或者对更多数据的分析确定
    m = 0.1  # 招生计划变化对录取概率的影响系数m 例如，招生计划增加\(10\%\)，录取概率可能增加\(0.1\)等
    wc = 0  # 可能录取的最次位次
    p = 0  # 录取概率
    wc = step1(mins, wcss, zcss, years, c)
    wc = step2(wc, d, ndxs, years, k)

    # 生成一系列考生位次的值
    b_values = np.arange(1, c + 1)
    probabilities = []
    for b_val in b_values:
        prob = step3(b_val, wc, l, sums, years, c, m)
        probabilities.append(prob)

    # 绘制考生位次与录取概率的走势曲线
    plt.plot(b_values, probabilities)
    plt.xlabel('wc')
    plt.xticks(rotation=45)
    plt.ylabel('gv')
    plt.title('chart')
    plt.grid(True)
    plt.show()

    p = step3(b, wc, l, sums, years, c, m)
    print(f'录取概率为：{p}')
